/*
 * @lc app=leetcode.cn id=309 lang=golang
 *
 * [309] 最佳买卖股票时机含冷冻期
 */

// @lc code=start
func maxProfit(prices []int) int {
	if len(prices) == 1 {
		return 0
	}
	dp := make([][3]int, len(prices))

	dp[0][0] = -prices[0] // 手上持有股票的最大收益
	for i := 1; i < len(prices); i++ {
		dp[i][0] = max(dp[i-1][0], dp[i-1][2]-prices[i])
		dp[i][1] = dp[i-1][0] + prices[i]
		dp[i][2] = max(dp[i-1][1], dp[i-1][2])
	}

	return max(dp[len(prices)-1][1], dp[len(prices)-1][2])
}

func max(x, y int) int {
	if x > y {
		return x
	}
	return y
}

// @lc code=end

// @lc code=start
func maxProfit(prices []int) int {
	if len(prices) == 1 {
		return 0
	}
	dp := make([][]int, len(prices))
	for i := 0; i < len(prices); i++ {
		dp[i] = make([]int, 3)
	}

	dp[0][0] = -prices[0] // 手上持有股票的最大收益
	dp[0][1] = 0          // 手上不持有股票，并且处于冷冻期中的累计最大收益
	dp[0][2] = 0          // 手上不持有股票，并且不在冷冻期中的累计最大收益
	for i := 1; i < len(prices); i++ {
		dp[i][0] = max(dp[i-1][0], dp[i-1][2]-prices[i])
		dp[i][1] = dp[i-1][0] + prices[i]
		dp[i][2] = max(dp[i-1][1], dp[i-1][2])
	}

	return max(dp[len(prices)-1][1], dp[len(prices)-1][2])
}

func max(x, y int) int {
	if x > y {
		return x
	}
	return y
}

// @lc code=end

 